﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Tiro_Alvo.Estados.Jogo
{
    class Jogo: EstadoBase
    {

        #region Atributos
       
        //todo colocar em uma alvo manager...
        public static Alvo[] alvos;
    
        //todo classe estilingue
        Texture2D Estilingue;
        Rectangle Local_Estilingue;
        Rectangle mira;

        GameWindow Window;

        Texture2D fundo;

        //toda classe balcao
        Texture2D balcao;
        public static Rectangle Local_balcao;

        //TODO classe bola
        Texture2D bola;
        Vector2 origemBola;
        public static Vector2 local_Bola;
        bool clicou = false;
        bool tentei = false;
        float pontY = 0;
        float pontX = 0;
        int contador;
        bool movimentandoABolaAteoAlvo = false;
        float proporcao;
        ContentManager Content;
        
        SpriteFont arial;

        public static int pontos;
        public static int dificuldade;

        Botao sair;

        #endregion

        #region Metódos

        public Jogo(ContentManager Content, GameWindow Window)
         : base(Content)
        {
            dificuldade = 1;
           
            this.Window = Window;
            this.Content = Content;

            //Load na textura do Fundo
            fundo = Content.Load<Texture2D>("Estado/Jogo/Textures/jogo");

            //Load na textura do Balcao
            balcao = Content.Load<Texture2D>("Estado/Jogo/Textures/Balcao");
            //load na posição do balcao
            Local_balcao = new Rectangle((Window.ClientBounds.Width / 2 - balcao.Bounds.Width / 2 - 170), 310, 730, 365);

            //Load da Textura do estilingue
            Estilingue = Content.Load<Texture2D>("originais_1/Animação Estilingue/Estilingue1");
            //Load da posicao do Estilingue
            Local_Estilingue = new Rectangle(Window.ClientBounds.Width / 2 - 100, Window.ClientBounds.Height - 300, 200, 210);

            //Load no alvo
            alvos = new Alvo[4];
            alvos[0] = new Alvo(Content);
            alvos[1] = new Alvo(Content);
            alvos[2] = new Alvo(Content);
            alvos[3] = new Alvo(Content);
        
            //Load da Textura da Bola
            bola = Content.Load<Texture2D>("originais_1/Bola");
            //Load das posicoes da Bola
            local_Bola = new Vector2(Local_Estilingue.X +60 ,Local_Estilingue.Y+ 60);
            origemBola = new Vector2(Local_Estilingue.X + 22, Local_Estilingue.Y + 45);

            //Load na fonte
            arial = Content.Load<SpriteFont>("Estado/jogo/fonts/arial");

           //Load botao
            sair = new Botao(Content, TipoBotao.SAIR, new Vector2(1700 , 60), Game1.Estado.SAIR);

            /*alvos[0].Local_Alvo.Y =180;
            alvos[1].Local_Alvo.Y = 282;
            alvos[2].Local_Alvo.Y =384;
            alvos[3].Local_Alvo.Y =486;*/
            

            mira = new Rectangle(850,830,200,150);

           proporcao = Local_balcao.Width / mira.Width;
        }

        public override void Update(GameTime gameTime)
        {
            sair.Update(gameTime);

            //local_Bola = new Rectangle(Game1.estadoInput.mouse.X, Game1.estadoInput.mouse.Y, 25, 25);

          //  #region updatedoAlvo

            foreach (var alvo in alvos)
            {
                alvo.Update(gameTime, Content);
            }

           /* if (alvos[1].Local_Alvo.Y == alvos[0].Local_Alvo.Y)
            {

                alvos[1].Local_Alvo.Y = 46 * Game1.random.Next(0, 4) + 90;
            }
            if (alvos[1].Local_Alvo.Y == alvos[2].Local_Alvo.Y)
            {

                alvos[1].Local_Alvo.Y = 46 * Game1.random.Next(0, 4) + 90;
            }
 

            if (alvos[0].Local_Alvo.Y == alvos[1].Local_Alvo.Y)
            {

                alvos[0].Local_Alvo.Y = 46 * Game1.random.Next(0, 4) + 90;
            }

            if (alvos[0].Local_Alvo.Y == alvos[2].Local_Alvo.Y)
            {

                alvos[0].Local_Alvo.Y = 46 * Game1.random.Next(0, 4) + 90;
            }

            #endregion*/

            if (Game1.estadoInput.mouse.LeftButton == ButtonState.Pressed && Game1.estadoInput.mouse_anterior.LeftButton != ButtonState.Pressed)
            {
                Console.WriteLine(Game1.estadoInput.mouse.X +"      "+ Game1.estadoInput.mouse.Y);
               
                if (Game1.estadoInput.mouse.X >= local_Bola.X && Game1.estadoInput.mouse.X <= local_Bola.X + 50 && Game1.estadoInput.mouse.Y >= local_Bola.Y && Game1.estadoInput.mouse.Y <= local_Bola.Y + 50)
                {
                    clicou = true;
                    
                }
            }

            if (Game1.estadoInput.mouse.LeftButton == ButtonState.Released && Game1.estadoInput.mouse_anterior.LeftButton != ButtonState.Released && clicou)
            {
                clicou = false;
                pontY= CalcDistY();
                //pontX = CalcDistX();
                CalcDistX();
                movimentandoABolaAteoAlvo = true;

                //foreach(var alvo in alvos)
                //{
                //    if (pontY >= alvo.Local_Alvo.Y - 25 && pontY <= alvo.Local_Alvo.Y + 25 && pontX >= alvo.Local_Alvo.X - 25 && pontX <= alvo.Local_Alvo.X + 25)
                //    {
                //        alvo.acertou = true;
                //        local_Bola = Vector2.Lerp(origemBola, new Vector2((int)alvo.Local_Alvo.X + 25, (int)alvo.Local_Alvo.Y + 25), 1);
                      
                //    }
                //   // Console.WriteLine(pontX + " oioi  " + alvo.Local_Alvo.X );

                //  //  Console.WriteLine(pontY + "  oioi " + alvo.Local_Alvo.Y);
                //}

                //tentei = true;
                             
            }

            if (movimentandoABolaAteoAlvo)
            {
                //local_Bola = Vector2.Lerp(local_Bola, new Vector2((int)pontX + 25, (int)pontY + 25), 1);
                if(pontX<Local_balcao.Width/2)
                {
                    local_Bola.X += 1;
                }
                else
                {
                    local_Bola.X -= 1;
                }
                
                local_Bola.Y -= 5;

                
                //if a bola atingiu a posicao, movimentandoABolaAteoAlvo = false
            }

            if(clicou)
            {
                local_Bola = new Vector2(Game1.estadoInput.mouse.X-25/2, Game1.estadoInput.mouse.Y-25/2);
                if (local_Bola.Y >= mira.Y + mira.Height)
                {
                    local_Bola.Y = mira.Y + mira.Height;
                }
                if (local_Bola.Y <= mira.Y)
                {
                    local_Bola.Y = mira.Y;
                }
                if (local_Bola.X >= mira.X +mira.Width)
                {
                    local_Bola.X = mira.X + mira.Width;
                }
                if (local_Bola.X <= mira.X)
                {
                    local_Bola.X = mira.X;
                }
            }

            if (tentei)
            {
                if(pontX !=0 || pontY != 0){


                   //local_Bola = Vector2.Lerp(origemBola, new Vector2((int)pontX + 25, (int)pontY + 25), 1);
                       
                    contador++;
                    if(contador==50)
                    {
                        contador = 0;
                        tentei = false;
                        clicou = false;
                        local_Bola = new Vector2((int)origemBola.X, (int)origemBola.Y);

                    }
                }
            }
           
          
        }

        public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            //Desenha o fundo
            spriteBatch.Draw(fundo, new Rectangle(0, 0, 1920, 1080), Color.White);

            //Desenha o balcao
            spriteBatch.Draw(balcao, Local_balcao, Color.White);

            //desenha o Alvo
            foreach (var alvo in alvos)
            { 
                alvo.Draw(gameTime, spriteBatch);
            }
           
            spriteBatch.Draw(Estilingue, Local_Estilingue, new Rectangle(0, 0, Estilingue.Width, Estilingue.Height), Color.White);

            spriteBatch.Draw(bola, local_Bola, Color.White);

            //Desenha a string "pontos"
            spriteBatch.DrawString(arial, "Pontos: " + pontos, new Vector2(10, 380), Color.Red);

            sair.Draw(spriteBatch);
        }

        private float CalcDistY()
        {

            float y0;

            float pontFinal;

            y0 =  local_Bola.Y - origemBola.Y;

            
            pontFinal = (180 * y0 / mira.Height)+100;

            
           
                if (pontFinal <= Local_balcao.Width/2)
                {
                    float aux;
                    aux = pontFinal - 80;
                    pontFinal = 265 - aux;
                }
                else
                {
                    float aux;
                    aux = 265 - pontFinal;
                    pontFinal = 80 + aux;
                }
            

            return pontFinal;
        }



        private void  CalcDistX()
        {
            float distanciaMovida;
           
            distanciaMovida = local_Bola.X - origemBola.X;

            if (distanciaMovida < 0)
            {
                distanciaMovida *= -1;
                pontX = proporcao * distanciaMovida + Local_balcao.X;
                Console.WriteLine("Esse é o meu pontx final:  " + pontX);
            }
            else
            {
                pontX = proporcao * distanciaMovida + Local_balcao.X;
                Console.WriteLine("Esse é o meu pontx final:  " + pontX);
            }
        }



         #endregion

    }

    #region Botão

    enum TipoBotao { SAIR };

    class Botao
    {
        enum EstadoBotao { NORMAL, MOUSE_SOBRE, MOUSE_FORA, PRECIONADO, };
        Texture2D imagem;
        int DX;
        EstadoBotao estadoBotao;
        Game1.Estado estado;
        Vector2 posicao;
        TipoBotao tipo;
        Rectangle caixa;
        Rectangle caixa_Posicao;
       

        public Botao(ContentManager Content, TipoBotao tipo, Vector2 posicao, Game1.Estado estado)
        {
            this.tipo = tipo;
            this.posicao = posicao;
            this.estado = estado;
            imagem = Content.Load<Texture2D>("Estado/jogo/Textures/botaoSair1");
            switch (tipo)
            {

                case TipoBotao.SAIR:
                    DX = 0;
                    break;

            }
            caixa = new Rectangle(0, DX, 250, 83);
            caixa_Posicao = new Rectangle((int)posicao.X, (int)posicao.Y, 820, 110);
        }

        public void Update(GameTime gameTime)
        {
            if (Game1.estadoInput.mouseOver(caixa_Posicao))
            {
                
                if (Game1.estadoInput.mouse.LeftButton == ButtonState.Pressed && Game1.estadoInput.mouse_anterior.LeftButton != ButtonState.Pressed)
                {
                    estadoBotao = EstadoBotao.PRECIONADO;
                }
                else
                {
                    if (estadoBotao == EstadoBotao.PRECIONADO)
                    {
                        Game1.estado_atual = estado;
                    }
                    else
                    {
                        estadoBotao = EstadoBotao.MOUSE_SOBRE;
                    }
                }
            }
            else
            {
                
                if (estadoBotao == EstadoBotao.MOUSE_SOBRE)
                {
                    estadoBotao = EstadoBotao.MOUSE_FORA;
                }
                else
                {
                    estadoBotao = EstadoBotao.NORMAL;
                }
            }

        }

        public void Draw(SpriteBatch spriteBatch)
        {
           
                switch (estadoBotao)
                {
                    case EstadoBotao.NORMAL:
                        spriteBatch.Draw(imagem, posicao, caixa, Color.White);
                        break;

                    default:
                        spriteBatch.Draw(imagem, posicao, caixa, Color.White);
                        break;

                }
            

        }


    }

    #endregion

}